#ifndef __W25Q128_H__
#define __W25Q128_H__

#include <rtthread.h>
#include <rtdevice.h>
#include "drv_spi.h"

/* 调试标签定义 */
#define DBG_TAG "w25qxx"
#define DBG_LVL DBG_INFO
#include <rtdbg.h>

/* SPI总线和设备名称定义 */
#define W25Q_SPI_BUS_NAME       "spi0"      // SPI总线名称，根据硬件修改
#define W25Q_SPI_DEVICE_NAME    "spi01"     // SPI设备名称，根据硬件修改
#define W25Q_CS_PIN             GET_PIN(11, 3)  // 片选引脚

/* W25Q128指令定义 */
#define W25X_JEDEC_ID           0x9F        // 读取JEDEC ID命令
#define W25X_WRITE_ENABLE       0x06        // 写使能命令
#define W25X_READ_STATUS_REG1   0x05        // 读取状态寄存器1命令

/* 设备标识常量 */
#define W25Q_MANUFACTURER_ID    0xEF        // Winbond制造商ID
#define W25Q_DEVICE_ID          0x4018      // W25Q128JV设备ID

// 注意 擦写后写入之间 需要40ms以上的 延时  ！！！！！！！！！！！！！！ ！！！！！！！ 擦写需要时间！！！！
/* 函数声明 */
bool w25q_is_initialized(void);
rt_err_t w25q_read_data(uint32_t address, uint8_t *data, size_t length);
void cmd_id_read(void *parameter);
rt_err_t w25q_erase_sector(uint32_t sector_address);
rt_err_t w25q_write_data(uint32_t address, const uint8_t *data, size_t length);
int w25q_spi_init(void);  // 修改：返回类型从rt_err_t改为int
rt_err_t w25q_write_data_with_erase(uint32_t address, const uint8_t *data, size_t length);
rt_err_t w25q_read_status(uint8_t *status);
rt_err_t w25q_write_enable(void);
rt_err_t w25q_read_id(uint8_t *manufacturer_id, uint16_t *device_id);
static void continuous_id_read_thread(void *parameter);
void read_test(void *parameter);
void erase_test(void *parameter);
void cmd_id(int argc, char *argv[]);
static void w25q_periodic_rw_thread(void *parameter);
static void init_test_data(void);
static int verify_data(void);
void write_read(void);
void cmd_w25q_rw_test(int argc, char *argv[]);

#endif /* __W25Q128_H__ */
